package ctrservice
//
//import (
//)
//
//const (
//	ScanIPsDo = "/scan/ips/do"
//	ScanIPsDoRateBucket = 2
//	ScanIPsDoMaxBucketCnt = 5
//	ScanIPsDoMaxIP = 400
//)
//
//// ScanWolAgentController 触发安全扫描的
//type ScanWolAgentController struct {
//	beego.Controller
//}
//
//// ScanIPsInJSON ip输入的入参形式
//type ScanIPsInJSON struct {
//	woltoken.VerifyData
//	IPs 			string
//}
//
//// paramsDoScanForIPs 解析入参
//func (s *ScanWolAgentController) paramsDoScanForIPs() (*ScanIPsInJSON, error) {
//	bucket, err := comlimit.GetTokenBucket(ScanIPsDo)
//	if err != nil {
//		return nil, fmt.Errorf("get bucket error: %s", err.Error())
//	}
//	if bucket.Allow() == false {
//		return nil, fmt.Errorf("too fast request for rate:%d/s and first:%d", ScanIPsDoRateBucket, ScanIPsDoMaxBucketCnt)
//	}
//
//	// 解析入参
//	body, err := ioutil.ReadAll(s.Ctx.Request.Body)
//	if err != nil {
//		return nil, fmt.Errorf("input param err: %s", err.Error())
//	}
//	inputJSON := new(ScanIPsInJSON)
//	err = json.Unmarshal(body, inputJSON)
//	if err != nil {
//		return nil, fmt.Errorf("input param unmarshal error: %s", err.Error())
//	}
//
//	// token校验
//	err = comhttp.DoSignVerify(*inputJSON)
//	if err != nil {
//		return nil, fmt.Errorf("token sign verify error: %s", err.Error())
//	}
//
//	return inputJSON, nil
//}
//
//// parseIPs 解析ips
//func (s *ScanWolAgentController) parseIPs(inputJSON *ScanIPsInJSON) ([]string, error) {
//	// 解析传入的ip
//	tmps := strings.Split(inputJSON.IPs, ",")
//	if len(tmps) <= 0 {
//		return nil, fmt.Errorf("input ip empty")
//	}
//
//	var ips []string
//	for _, item := range tmps {
//		// 避免无效的
//		item = strings.TrimSpace(item)
//		if net.ParseIP(item) == nil {
//			continue
//		}
//
//		// 避免重复的
//		isHave := false
//		for _, i := range ips {
//			if item == i {
//				isHave = true
//			}
//		}
//		if isHave == false {
//			ips = append(ips, item)
//		}
//	}
//	if len(ips) <= 0 {
//		return nil, fmt.Errorf("valid ips empty")
//	}
//	if len(ips) > ScanIPsDoMaxIP {
//		return nil, fmt.Errorf("input ips large")
//	}
//
//	return ips, nil
//}
//
//// DoScanForIPs 根据输入的ip执行扫描，返回任务task id
//func (s *ScanWolAgentController) DoScanForIPs()  {
//	// 参数解析
//	inputJSON, err := s.paramsDoScanForIPs()
//	if err != nil {
//		logs.Error(err.Error())
//		s.Data["json"] = comhttp.CreateErrResponse(comhttp.RespCodeParamsErr, err.Error(), nil)
//		s.ServeJSON()
//		return
//	}
//
//	// ips解析
//	ips, err := s.parseIPs(inputJSON)
//	if err != nil {
//		logs.Error(err.Error())
//		s.Data["json"] = comhttp.CreateErrResponse(comhttp.RespCodeParamsErr, err.Error(), nil)
//		s.ServeJSON()
//		return
//	}
//
//	// 执行扫描处理
//	data, err := s.doScanForIPs(ips)
//	if err != nil {
//		logs.Error(err.Error())
//		s.Data["json"] = comhttp.CreateErrResponse(comhttp.RespCodeSystemErr, err.Error(), nil)
//		s.ServeJSON()
//		return
//	}
//
//	s.Data["json"] = comhttp.CreateOkResponse(data)
//	s.ServeJSON()
//	return
//}
//
//// ScanResult 返回的结果
//type ScanResult struct {
//	TaskID 					string		`json:"task_id"`
//	InputValidIPCnt 		int			`json:"input_valid_ips_cnt"`
//	OnlineIPCnt 			int			`json:"online_ip_cnt"`
//}
//
//// doScanForIPs 执行扫描处理
//func (s *ScanWolAgentController) doScanForIPs(ips []string) (*ScanResult, error) {
//	// 处理weapons
//	wp := dbmanager.WolWeapon{}
//	wps, err := wp.SelectByMode(mysqldb.SelectOffsetZero, mysqldb.SelectLimitAll, mysqldb.StatusValid,
//		dbmanager.WeaponTaskModeBaseSec, mysqldb.SelectIntAll)
//	if err != nil {
//		return nil, fmt.Errorf("select weapons error: %s", err.Error())
//	}
//	var wpsNames []string
//	for _, item := range wps {
//		wpsNames = append(wpsNames, item.Name)
//	}
//
//	// 处理机器对象
//	wolId := dbmanager.WormId{}
//	wolIds, err := wolId.SelectByIPs(mysqldb.SelectOffsetZero, mysqldb.SelectLimitAll, dbmanager.WolAgentOnline, mysqldb.SelectIntAll, ips)
//	if err != nil {
//		return nil, fmt.Errorf("select wolagents error: %s", err.Error())
//	}
//	if len(wolIds) <= 0 {
//		return nil, fmt.Errorf("no wolagent online in input ips")
//	}
//
//	// 任务id
//	taskID := wolid.TaskIdProducer().CreateTaskId()
//	// 准备插入任务
//	task := &dbtask.WolTask{
//		TaskId:      taskID,
//		TaskOwner:   "ScanWolAgentController",
//		TargetType:  ctrutil.TaskForIPList,
//		Target:      fmt.Sprintf("指定ip(%d)", len(ips)),
//		WeaponsName: strings.Join(wpsNames, ","),
//		Comment:     "指定ip基础扫描",
//		SumCount:    len(wolIds) * len(wpsNames),
//		Created:     time.Now().Unix(),
//		Status:      ctrutil.WEAPON_TASK_DOING,
//	}
//	task.Updated = task.Created
//	err = task.Insert()
//	if err != nil {
//		return nil, fmt.Errorf("insert task error: %s", err.Error())
//	}
//
//	// 启动任务，异步方式
//	scan := &fasttask.ScanWolAgentTask{
//		WolIds: wolIds,
//		Task: task,
//	}
//	taskqueue.FastQueInst().MsgQ.Push(scan)
//
//	ret := &ScanResult{
//		TaskID: taskID,
//		InputValidIPCnt: len(ips),
//		OnlineIPCnt: len(wolIds),
//	}
//	return ret, nil
//}
//
//// ScanReport 扫描的报告
//type ScanReport struct {
//	TaskId 			string			`json:"task_id"`
//	TaskStatus 		string			`json:"task_status"`
//
//	Alerts 			map[string][]*Alert	`json:"alerts"`		// ip对应的告警
//}
//
//// setTaskStatus 设置TaskStatus
//func (s *ScanReport) setTaskStatus(status int) {
//	if status == ctrutil.WEAPON_TASK_DOING {
//		s.TaskStatus = "正在执行"
//	} else if status == ctrutil.WEAPON_TASK_DO_OK {
//		s.TaskStatus = "执行完成"
//	} else if status == ctrutil.WEAPON_TASK_DO_FAILED {
//		s.TaskStatus = "执行失败"
//	}
//	return
//}
//
//// Alert 单个检查项说明
//type Alert struct {
//	IP 				string 			`json:"ip"`
//	WeaponName 		string			`json:"weapon_name"`
//	OptionName		string			`json:"option_name"`
//	Result 			string			`json:"result"`
//	AlertMsg 		string			`json:"alert_msg"`
//	CreateTime		string			`json:"create_time"`
//}
//
//func (s *ScanReport) addAlert(alert *Alert) {
//	_, exist := s.Alerts[alert.IP]
//	if exist == false {
//		s.Alerts[alert.IP] = []*Alert{alert}
//	} else {
//		s.Alerts[alert.IP] = append(s.Alerts[alert.IP], alert)
//	}
//}
//
//func (a *Alert) setResult(result int) {
//	if result == 0 {
//		a.Result = "警告"
//	} else {
//		a.Result = "通过"
//	}
//	return
//}
//
//func (a *Alert) setWeaponName(wpNameMap map[int64]string, wpId int64) {
//	_, exist := wpNameMap[wpId]
//	if exist != true {
//		wp := dbmanager.WolWeapon{Id: wpId}
//		err := wp.Read("id")
//		if err != nil {
//			logs.Error(err.Error())
//		} else {
//			wpNameMap[wpId] = wp.Name
//			a.WeaponName = wp.Name
//		}
//	} else {
//		a.WeaponName = wpNameMap[wpId]
//	}
//	return
//}
//
//func (a *Alert) setIP(wolIdIPMap map[string]string, wormId string) error {
//	_, exist := wolIdIPMap[wolId]
//	if exist != true {
//		worm := dbmanager.WormId{WolverineId: wolId}
//		err := worm.Read("wolverine_id")
//		if err != nil {
//			logs.Error(err.Error())
//			return err
//		} else {
//			wormIdIPMap[wolId] = worm.Ip
//			a.IP = worm.Ip
//			return nil
//		}
//	} else {
//		a.IP = wormIdIPMap[wolId]
//	}
//	return nil
//}
//
//// ScanReportController 需要访客模式
//type ScanReportController struct {
//	ctrconfig.LoginCtr
//}
//
//// GetScanReportForIPs 拉取报告
//func (s *ScanReportController) GetScanReportForIPs() {
//	if s.Guest() == false {
//		return
//	}
//
//	// 参数解析
//	taskId := s.GetString("task_id", mysqldb.SelectStrAll)
//	if taskId == mysqldb.SelectStrAll {
//		s.Data["json"] = comhttp.CreateErrResponse(comhttp.RespCodeParamsErr, "input task_id error", nil)
//		s.ServeJSON()
//		return
//	}
//	outputType := s.GetString("output", "json")
//
//	// 任务查询
//	task := dbtask.WolTask{TaskId: taskId}
//	err := task.Read("task_id")
//	if err != nil {
//		errMsg := fmt.Sprintf("select task error: %s", err.Error())
//		logs.Error(errMsg)
//		s.Data["json"] = comhttp.CreateErrResponse(comhttp.RespCodeParamsErr, err.Error(), nil)
//		s.ServeJSON()
//		return
//	}
//	report := &ScanReport{
//		TaskId: task.TaskId,
//		Alerts: make(map[string][]*Alert),
//	}
//	report.setTaskStatus(task.Status)
//
//	// 处理数据
//	al := dbdata.WolWeaponAlertLog{}
//	als, err := al.SelectForReport(mysqldb.SelectOffsetZero, mysqldb.SelectLimitAll, taskId, dbdata.WeaponAlertFailed)
//	if err != nil {
//		logs.Error(fmt.Sprintf("select data error: %s", err.Error()))
//		s.Data["json"] = comhttp.CreateErrResponse(comhttp.RespCodeParamsErr, err.Error(), nil)
//		s.ServeJSON()
//		return
//	}
//
//	wolIdIPMap := make(map[string]string)
//	wpNameMap := make(map[int64]string)
//	// 整理数据
//	for _, item := range als {
//		alert := new(Alert)
//		// weapon name
//		alert.setWeaponName(wpNameMap, item.WeaponId)
//		alert.OptionName = item.OptionName
//		alert.setResult(item.Result)
//		alert.AlertMsg = item.AlertMsg
//		alert.CreateTime = time.Unix(item.Created, 0).Format(comconfig.TimeFormat)
//		err := alert.setIP(wolIdIPMap, item.WormId)
//		if err != nil {
//			continue
//		}
//		report.addAlert(alert)
//	}
//
//	// 准备返回结果
//	if outputType == "html" {
//		s.Data["TaskId"] = report.TaskId
//		s.Data["TaskStatus"] = report.TaskStatus
//		var l []*Alert
//		for _, v := range report.Alerts {
//			l = append(l, v...)
//		}
//		s.Data["Alerts"] = l
//		s.Data["AlertCnt"] = len(l)
//
//		// 提供一个按钮，用于执行下载操作，下载xlxs文件
//		if task.Status == ctrutil.WEAPON_TASK_DO_OK {
//			if comconfig.RunMode() == comconfig.RunModeWuXi {
//				s.Data["AlertNumber"] = fmt.Sprintf("https://xxxx.meili-inc.com/weapon/task/report/alert" +
//					"?task_id=%s", task.TaskId)
//			} else if comconfig.RunMode() == comconfig.RunModeLocalHost || comconfig.RunMode() == comconfig.RunModeDev {
//				s.Data["AlertNumber"] = fmt.Sprintf("https://dev.xxxxx.meili-inc.com:8124" +
//					"/weapon/task/report/alert?task_id=%s", task.TaskId)
//			}
//		}
//
//		s.TplName = "scan_ips_report.html"
//	} else {
//		s.Data["json"] = comhttp.CreateOkResponse(report)
//		s.ServeJSON()
//	}
//	return
//}
